package com.clps.rulesregulations.util;

import org.apache.poi.hmef.Attachment;
import org.apache.poi.hmef.HMEFMessage;
import org.apache.poi.hmef.attribute.MAPIRtfAttribute;
import org.apache.poi.hsmf.datatypes.MAPIProperty;

import java.io.*;

/**
 * @author zhangchao
 * @date 2018-12-17
 */
public class HMEFContentsExtractor {
    public static void main(String[] args) throws Exception {
        if(args.length < 2) {
            System.err.println("Use:");
            System.err.println("  HMEFContentsExtractor <filename> <output dir>");
            System.err.println("");
            System.err.println("");
            System.err.println("Where <filename> is the winmail.dat file to extract,");
            System.err.println(" and <output dir> is where to place the extracted files");
            System.exit(2);
        }

        HMEFContentsExtractor ext = new HMEFContentsExtractor(new File(args[0]));

        File dir = new File(args[1]);
        File rtf = new File(dir, "message.rtf");
        if(! dir.exists()) {
            throw new FileNotFoundException("Output directory " + dir.getName() + " not found");
        }

        System.out.println("Extracting...");
        ext.extractMessageBody(rtf);
        ext.extractAttachments(dir);
        System.out.println("Extraction completed");
    }

    private HMEFMessage message;
    public HMEFContentsExtractor(File filename) throws IOException {
        this(new HMEFMessage(new FileInputStream(filename)));
    }
    public HMEFContentsExtractor(HMEFMessage message) {
        this.message = message;
    }

    /**
     * Extracts the RTF message body to the supplied file
     */
    public void extractMessageBody(File dest) throws IOException {
        FileOutputStream fout = new FileOutputStream(dest);

        MAPIRtfAttribute body = (MAPIRtfAttribute)
                message.getMessageMAPIAttribute(MAPIProperty.RTF_COMPRESSED);
        fout.write(body.getData());

        fout.close();
    }

    /**
     * Extracts all the message attachments to the supplied directory
     */
    public void extractAttachments(File dir) throws IOException {
        int count = 0;
        for(Attachment att : message.getAttachments()) {
            count++;

            // Decide what to call it
            String filename = att.getLongFilename();
            if(filename == null || filename.length() == 0) {
                filename = att.getFilename();
            }
            if(filename == null || filename.length() == 0) {
                filename = "attachment" + count;
                if(att.getExtension() != null) {
                    filename += att.getExtension();
                }
            }

            // Save it
            File file = new File(dir, filename);
            FileOutputStream fout = new FileOutputStream(file);
            fout.write( att.getContents() );
            fout.close();
        }
    }
}
